package org.epsi.blokus;

import org.epsi.blokus.TWL_Slick_Binding.SlickTwlGame;
import java.net.Socket;
import java.util.Random;
import org.epsi.blokus.joueur.*;
import org.epsi.blokus.salon.ServerClient;

/**
 * Gestionnaire principal du jeu
 * @author julien.lafont
 */
public class Hex extends SlickTwlGame {

   // ---- Gestion du singleton -----
   private static Hex _instance = null;
   
   public static Hex getInstance() {
       if (_instance == null) _instance = new Hex();
       return _instance;
   }

   // ------------ Paramètres de la partie -------------

    private Opponent opponent;
    private Client client;
    
    private LocalGame localGame = null;
    private OnlineGame onlineGame = null;
    

    /**
    * Nouvelle partie d'entrainement ( joueur vs ordinateur )
    */
    public void newTrainingGame()
    {
       
        // Couleur aléatoire
        TTypePiece[] couleurs = { TTypePiece.Rouge, TTypePiece.Bleu };
        Random r = new Random(System.currentTimeMillis());
        int nbAleatoire = r.nextInt(2);

        // Initialise l'adversaire
        opponent = new TrainingOpponent(couleurs[nbAleatoire]);
        opponent.setPseudo("Ordinateur");
        opponent.setAvatar(AVATAR_LIST[r.nextInt(AVATAR_LIST.length)]);

        // Initialise le joueur local
        client = new TrainingClient(couleurs[(nbAleatoire+1)%2]);

        // Initialise le gestionnaire de jeu
        localGame = new LocalGame(client, opponent);
        new Thread(localGame).start();

        SlickInitialisation();
        
    }

    /**
     * Nouvelle partie en ligne
     * @param socket
     * @param salonId
     */
    public void newOnlineGame(ServerClient servCli, boolean maitre)
    {

        // Création des joueurs
        client = new OnlineClient((maitre ? TTypePiece.Bleu : TTypePiece.Rouge), servCli, maitre);
        opponent = new OnlineOpponent((maitre ? TTypePiece.Rouge : TTypePiece.Bleu));

        // Création du gestionnaire de jeu, qui écoutera les messages reçus par le joueur principal
        onlineGame = new OnlineGame(client, opponent);
        servCli.deleteObservers();
        servCli.addObserver(onlineGame); // Les échanges avec le serveur sont gérés par la classe onlineGame


        new Thread(onlineGame).start();

        // Lancement du jeu
        SlickInitialisation();
        //onlineGame.run();
        
        // On tente de lancer le gestionnaire dans le même thread pour résoudre le problème de communication... sans succès

        
    }


    // ------------------ Accesseurs ------------------- //

    /**
     * Retourne l'adversaire
     * @return
     */
    public synchronized Opponent getOpponent() {
        return opponent;
    }

    /**
     * Retourne le joueur
     * @return
     */
    public synchronized Client getPlayer() {
        return client;
    }

    /**
     * Retourne le gestionnaire de partie locale
     * @return
     */
    public LocalGame getLocalGame()
    {
        return localGame;
    }

  


 
}
